/******************************************************************************/
/* File: flowConfig.h                                                         */
/******************************************************************************/

#ifndef FLOWCONFIG_H
#define FLOWCONFIG_H

#include <time.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include "cjson.h"

/******************************************************************************/
/*
目前考虑四种流量模型：
1 StableFlowModel
2 RectFlowModel
3 PoissonFlowModel
4 CustomFlowModel
 */
/******************************************************************************/

/******************************************************************************/
/*
稳恒流量模型 ==== 速率保持不变
   ----------------------------------------------------------------------------

|||------------------------------------------------------------------------->>>
 */
/******************************************************************************/
class StableFlowModel {

public:
    StableFlowModel() {
        
    }
    
    ~StableFlowModel() {
        
    }

    int64_t GetNextRate();
    cJSON* GenToJson();
    void ParseFromJson(cJSON *json);
    
public:
    int64_t iRate;
    
};

/******************************************************************************/
/*
方波流量模型 ==== 速率在两个速率间来回跳动
如：
        -----------                   -------------------      -------   maxRate
        |         |                   |                  |     |     |
---------         ---------------------                  -------     --- minRate 

|||--------------------------------------------------------------------------->>>
 */
/******************************************************************************/

class RectFlowModel {

public:
    RectFlowModel() {
        
    }
    
    ~RectFlowModel() {
        
    }

    int64_t GetNextRate();
    cJSON* GenToJson();
    void ParseFromJson(cJSON *json);
    
public:
    int64_t iMaxRate;
    int64_t iMinRate;
    double fMaxProportion;
};

/******************************************************************************/
/*
泊松流量模型 ==== 完全随机的流量过程
 */
/******************************************************************************/

class PoissonFlowModel {

public:
    PoissonFlowModel() {
        
    }
    
    ~PoissonFlowModel() {
        
    }

    int64_t GetNextRate();
    
    cJSON* GenToJson();
    void ParseFromJson(cJSON *json);

public:
    int64_t iBurstRate;
};

/******************************************************************************/
/*
自定义流量模型 ==== 暂时不做这部分工作
 */
/******************************************************************************/
class CustomFlowModel {

public:
    //...
};

/******************************************************************************/
/*
FlowConfig Class内容主要分为两部分：
1 连接信息
2 流量行为
 */
/******************************************************************************/
class FlowConfig {

public:
    
    // 构造与析构函数
    FlowConfig();
    ~FlowConfig();
    
    int64_t GetNextRate();
    
    cJSON* GenToJson();
    void ParseFromJson(cJSON *json);
    
    // 打印配置信息
    void PrintInfo();

public:  
    // 连接信息

    // 新建连接时，并没有连接，端口号并不可知，故而，端口号并不可用
    // 源目端口号并不影响如何新建连接，只会影响修改连接配置和删除连接
    char *sSenderIP;
    char *sRecverIP;
    
    /**
     关于FlowConfig，有一点处理技巧：
     sSenderIP <-> sRecverIP流
     在ADD操作时，iSenderPort无意义，iRecverPort指的是TrafficServer的流量服务器监听端口
     但是，一旦连接建立，iRecverPort即更改为建立的连接Recver的端口号，而不再是服务器监听端口
    **/    
    int iSenderPort;
    int iRecverPort;
    
    int bUseIPv6;
    int iRole; // 1 for Client, 2 for Server.
    int iProto; // 1 for TCP, 2 for UDP. --->>> TrafficModel is nothing to do with protocol.
    int iTime; // -1 for forever, 0 for nostart, positive number for iTime time interval.
    
    // 流量行为
    int iTrafficModel;  // 1 for StableFlowModel, 2 for RectFlowModel, 3 for PoissonFlowModel, 4 for CustomFlowModel.

    // 流量模型 ==> 目前暂包含所有地址（后期再做优化）
    StableFlowModel *pSfm;
    RectFlowModel *pRfm;
    PoissonFlowModel *pPfm;
};

#endif

/******************************************************************************/
/* End File: flowConfig.h                                                     */
/******************************************************************************/